package xproto

import (
	"fmt"
)

// ReqCode
type ReqCode = int

const (
	ReqNone ReqCode = iota //  空指令
	ReqQuery
	ReqParameters
	ReqLiveStream        //  实时视频
	ReqFtpTransfer       //  Ftp升级
	ReqControl           //  控制
	ReqSerialTransparent //  串口透传设置
	ReqSerialTransfer    //  串口传输数据
	ReqPlayback          //  录像文件回放
	ReqFileTransfer      //  文件传输
	ReqVoice
	ReqWriteData //  裸数据（文件、语音...）
	ReqUser      //  自定义请求
	ReqClose     //  关闭链接
)

// Response 通用请求应答
type Response struct {
	Session string      `json:"ss"`
	Details interface{} `json:"details"`
}

// LiveStream 实时流
type LiveStream struct {
	Session  string `json:"session"`
	Channel  int    `json:"channel"`
	Stream   int    `json:"stream"` // 0-主码流 1-子码流
	On       int    `json:"on"`     // 0-停止 1-开启
	Frames   string `json:"frames"` // 1;2;3
	Protocol int    `json:"protocol"`
	Server   string `json:"server"`
}

func (o LiveStream) FormatSess(deviceID string) string {
	return fmt.Sprintf("live_%s_%02d_%02d", deviceID, o.Channel, o.Stream)
}

// Voice 语音业务
type Voice struct {
	Session  string `json:"session"`
	WorkMode int    `json:"workMode"` // 0-监听 1-对讲 2-广播
	Channel  int    `json:"channel"`  // 通道
	On       int    `json:"on"`       // 0-停止 1-开启
	Server   string `json:"server"`
}

func (o Voice) FormatSess(deviceID string) string {
	return fmt.Sprintf("voice_%s_%02d_%02d", deviceID, o.Channel, o.WorkMode)
}

// Playback 录像文件回放
type Playback struct {
	Session   string `json:"session"`
	FileName  string `json:"fileName"`
	Server    string `json:"server"`
	StartTime string `json:"startTime"`
	EndTime   string `json:"endTime"`
	Channels  string `json:"channels"`
	Frames    string `json:"frames"` // 1;2;3
	Action    int    `json:"action"` // 0-下载式回放，1-流式回放
}

// Query 查找
type Query struct {
	Server    string `json:"server"`
	Session   string `json:"session"`
	StartTime string `json:"startTime"`
	EndTime   string `json:"endTime"`
	FileType  int    `json:"fileType"`
	Channels  string `json:"channels"` //
	Stream    int    `json:"stream"`   //
	Store     int    `json:"store"`    // 1 主录像 2
}

// File 查找结果
type File struct {
	FileName     string `json:"fileName"`
	FileType     int    `json:"fileType"`
	Channel      int    `json:"channel"`
	StartTime    string `json:"startTime"`
	EndTime      string `json:"endTime"`
	FileSize     int    `json:"fileSize"`
	FileDuration int    `json:"fileDuration"`
}

// SerialTransparent 串口透传设置
type SerialTransparent struct {
	Session  string `json:"session"`
	Port     int    `json:"port"`
	BaudRate int    `json:"baudRate"`
	DatBit   int    `json:"dataBit"`
	CheckBit int    `json:"checkBit"`
	StopBit  int    `json:"stopBit"`
}

// SerialData 透传数据
type SerialData struct {
	Type int    `json:"type"`
	Data string `json:"data"`
}

// FtpTransfer 文件传输
type FtpTransfer struct {
	Session  string `json:"session"`
	FtpURL   string `json:"ftpUrl"`   // ftp://admin:admin@192.168.1.101:21
	FileType int    `json:"fileType"` // 1:录像;2:报警录像;3:照片;4:报警照片;5:升级文件;6:日志文件;7:配置文件;8:黑匣子文件
	FileSrc  string `json:"fileSrc"`  // 源文件
	// jt1078协议虚拟文件格式 /tmp/jrec/chlstimestampetimestampalarmsourcestremstorenet
	FileDst string `json:"fileDst"` // 目标文件
	Action  int    `json:"action"`  //
}

// FileTransfer 文件传输
type FileTransfer struct {
	Session  string `json:"session"`  // 自动生成session
	FileType int    `json:"fileType"` // 1:录像;2:报警录像;3:照片;4:报警照片;5:升级文件;6:日志文件;7:配置文件;8:黑匣子文件
	FileName string `json:"fileName"`
	Server   string `json:"server"`
	Action   int    `json:"action"`   //
	FileSize int    `json:"fileSize"` // 文件大小，上传文件到设备时要设置做校验用
	Offset   int    `json:"offset"`
}

type User struct {
	CodeID string                 `json:"codeId"`
	Data   map[string]interface{} `json:"data"`
}

type CtrlCode = int

const (
	CtrlUnknow        CtrlCode = iota
	CtrlReboot                 // nil
	CtrlPTZ                    // PTZControl
	CtrlReset                  // nil
	CtrlVehi                   // nil
	CtrlGsensorAdjust          // nil
	CtrlOsdSpeed               // {"osdSpeed": }
	CtrlSnapshot               // CtrlSnapshot
	CtrlFormat                 // nil
	CtrlText                   // nil
	CtrlProperty
	CtrlPlayback
	CtrlLive
	CtrlMileReset
)

type Control struct {
	Type CtrlCode    `json:"ctrlCode"`
	Data interface{} `json:"data"`
}

// PTZCode
type PTZCode = int

const (
	PTZUnknow PTZCode = iota
	PTZUp
	PTZDown
	PTZLeft
	PTZRight
	PTZLeftUp
	PTZLeftDown
	PTZRightUp
	PTZRightDown
	PTZPreSetGoto
	PTZPreSetSet
	PTZPreSetClear
	PTZIrisOpen
	PTZIrisClose
	PTZZoomIn
	PTZZoomOut
	PTZFocusNear
	PTZFocusFar
	PTZAutoScan
	PTZBrushOn
	PTZBrushOff
	PTZCruiseOpen
	PTZCruiseClose
	PTZLightOn
	PTZLightOff
)

type ControlPTZ struct {
	Code    PTZCode `json:"code"`
	Channel int     `json:"channel"`
	Speed   int     `json:"speed"`
}

type CtrlOsd struct {
	Speed string `json:"osdSpeed"`
}

// 车辆控制
type VehiCode = int

const (
	VehiCutOil      VehiCode = iota // 切断油路
	VehiRecoveryOil                 // 恢复油路
	VehiCutCircuit                  // 切断电路
	VehiRecCircuit                  // 恢复电路
	VehiOpenDoor
	VehiCloseDoor
)

type ControlVehi struct {
	Code VehiCode `json:"code"`
	Door int      `json:"door,omitempty"` // Action=5或6有效
}

type ControlSnapshot struct {
	Channels  string `json:"channels"`  //
	Reslution int    `json:"reslution"` // 0-跟随录像 1-1080p 2-720p 4-D1

}
type CaptureResult struct {
	Channel  int    `json:"channel"`
	FileName string `json:"fileName"`
}

type ControlText struct {
	Type    int    `json:"type"`
	Content string `json:"content"`
}

type ControlLive struct {
	Channel          uint8 `json:"channel"`
	Type             uint8 `json:"type"`
	CloseMeidaType   uint8 `json:"closeMeidaType"`
	ToggleStreamType uint8 `json:"toggleStreamType"`
}
